package main

import "fmt"

//接口是一种类型 一种抽象的类型
// 接口定义了一个对象的行为规范， 只定义规范而不是实现， 由具体的对象实现规范的细节
// 实现接口的条件： 一个对象只要实现全部接口中的方法，那么就实现了这个接口（即： 接口是一个需要实现的方法列表）
//

// 接口
type Usber interface {
	getName() string
}

// phone 结构体
type Phone struct {
	Name string
}

// 方法
// func关键字  接收器（变量名 其类型--phone结构体类型的指针）  方法名（变量（数量与结构体一致） 变量类型）返回值{}
// *Phone一般在方法签名中使用；&Phone 一般在函数中调用，将实例化的结构体的内存地址传递给函数或方法
func (p *Phone) getName() string {
	return p.Name
}

// computer 结构体
type Computer struct {
	Name string
}

func (c *Computer) getName() string {
	return c.Name
}

func transData(usber Usber) string {
	name := usber.getName()
	return fmt.Sprintf("%v%v", name, "+ after transfer")
}

func main() {
	p := &Phone{Name: "xiaomi"}
	c := &Computer{Name: "lenovo"}
	var target Usber = p
	// var target Usber
	// target = p
	fmt.Println(target.getName())
	fmt.Printf("%T %v \n", target, target)

	var target2 Usber = c
	fmt.Println(target2.getName())
	fmt.Printf("%T %v \n", target2, target2)

	fmt.Println(transData(p))
	fmt.Println(transData(c))

}
